﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using PraxisRent.Entities;
using PraxisRent.BL;
using Microsoft.Practices.Unity;

namespace PraxisRent.UI
{
    public partial class FrmAlquiler : Form
    {
        [Dependency]
        public IAlquilerBL alquilerBL { get; set; }

        [Dependency]
        public IDetalleAlquilerBL detAlqBL { get; set; }

        [Dependency]
        public IClienteNaturalBL cliNaturalBL { get; set; }

        [Dependency]
        public IClienteJuridicoBL cliJuridicoBL { get; set; }

        [Dependency]
        public IEquipoBL equipoBL { get; set; }

        [Dependency]
        public IUsuarioMenuBL usuMenuBL { get; set; }

        public FrmAlquiler()
        {
            InitializeComponent();
            this.BuilUp();
        }

        bool isExtend;

        public void Extend()
        {
            isExtend = true;
        }

        public USUARIO currentUsuarioAlquiler { get; set; }

        private void FrmAlquiler_Load(object sender, EventArgs e)
        {
            if (currentUsuarioAlquiler != null)
            {
                menuLlena();
            }
            else
                cargaData();
        }

        public void menuLlena()
        {
            var datoUsuario = usuMenuBL.GetAllFromUsuarioByPersonaFromLogin(currentUsuarioAlquiler.PERSONA.Dni);

            var permisos = (from c in usuMenuBL.GetAllFromUsuarioMenuByMenuId(datoUsuario.UsuarioId)
                            select c.MENU.Tag.ToString()).ToArray();

            System.Windows.Forms.Button[] botones = new System.Windows.Forms.Button[] { 
            this.btnNuevo,this.btnEditar,this.btnEliminar,this.btnVerEntregas,this.btnVerDevolucion,this.btnCredito};

            //obtengo todos los PERMISOS NO ASIGNADOS al usuario
            var noVisible = from nv in botones
                            where !permisos.Contains(nv.Tag.ToString())
                            select nv;

            //coloco DESABILITADO a los permisos no asignados
            noVisible.ToList().ForEach(nv => nv.Enabled = false);

            cargaData();
        }

        public void cargaData()
        {
            aLQUILERBindingSource.DataSource = alquilerBL.GetAllFromAlquiler();
        }

        private void btnBuscarJuridico_Click(object sender, EventArgs e)
        {
            if (rbtnCliente.Checked == true && cbxCancelado.Checked == false)
            {
                aLQUILERBindingSource.DataSource = alquilerBL.GetAllFromAlquilerByCliente(TxtCriterio.Text);
                if (aLQUILERBindingSource.Count == 0)
                {
                    MessageBox.Show("Alquiler no existente.", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }

            if (rbtnObra.Checked == true && cbxCancelado.Checked == false)
            {
                aLQUILERBindingSource.DataSource = alquilerBL.GetAllFromAlquilerByObra(TxtCriterio.Text);
                if (aLQUILERBindingSource.Count == 0)
                {
                    MessageBox.Show("Alquiler no existente.", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }

            if (rbtnCliente.Checked == true && cbxCancelado.Checked == true)
            {
                aLQUILERBindingSource.DataSource = alquilerBL.GetAllFromAlquilerCanceladosByCliente(TxtCriterio.Text);
                if (aLQUILERBindingSource.Count == 0)
                {
                    MessageBox.Show("Alquiler no existente.", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }

            if (rbtnObra.Checked == true && cbxCancelado.Checked == true)
            {
                aLQUILERBindingSource.DataSource = alquilerBL.GetAllFromAlquilerCanceladosByObra(TxtCriterio.Text);
                if (aLQUILERBindingSource.Count == 0)
                {
                    MessageBox.Show("Alquiler no existente.", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }

        private void TxtCriterio_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if (rbtnCliente.Checked == true && cbxCancelado.Checked == false)
                {
                    aLQUILERBindingSource.DataSource = alquilerBL.GetAllFromAlquilerByCliente(TxtCriterio.Text);
                    if (aLQUILERBindingSource.Count == 0)
                    {
                        MessageBox.Show("Alquiler no existente.", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }

                if (rbtnObra.Checked == true && cbxCancelado.Checked == false)
                {
                    aLQUILERBindingSource.DataSource = alquilerBL.GetAllFromAlquilerByObra(TxtCriterio.Text);
                    if (aLQUILERBindingSource.Count == 0)
                    {
                        MessageBox.Show("Alquiler no existente.", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }

                if (rbtnCliente.Checked == true && cbxCancelado.Checked == true)
                {
                    aLQUILERBindingSource.DataSource = alquilerBL.GetAllFromAlquilerCanceladosByCliente(TxtCriterio.Text);
                    if (aLQUILERBindingSource.Count == 0)
                    {
                        MessageBox.Show("Alquiler no existente.", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }

                if (rbtnObra.Checked == true && cbxCancelado.Checked == true)
                {
                    aLQUILERBindingSource.DataSource = alquilerBL.GetAllFromAlquilerCanceladosByObra(TxtCriterio.Text);
                    if (aLQUILERBindingSource.Count == 0)
                    {
                        MessageBox.Show("Alquiler no existente.", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
            }
        }

        private void aLQUILERRadGridView_CurrentCellChanged(object sender, Telerik.WinControls.UI.CurrentCellChangedEventArgs e)
        {
            var currentAlquiler = aLQUILERBindingSource.Current as ALQUILER;

            if (currentAlquiler != null)
            {
                dETALLE_ALQUILERBindingSource.DataSource = detAlqBL.GetAllFromDetalleAlquilerByAlquilerId(currentAlquiler.Codigo);

                #region Cliente
                try
                {
                    for (int count = 0; count < aLQUILERRadGridView.Rows.Count; count++)
                    {
                        if (currentAlquiler != null)
                        {
                            CLIENTE a = aLQUILERRadGridView.Rows[count].Cells[1].Value as CLIENTE;
                            var cliJuri = (from c in cliJuridicoBL.GetAllFromClienteJuridico()
                                           where c.ClienteJuridicoId.Equals(a.Codigo)
                                           select c).SingleOrDefault();
                            var cliNat = (from c in cliNaturalBL.GetAllFromClienteNatural()
                                          where c.ClienteNaturalId.Equals(a.Codigo)
                                          select c).SingleOrDefault();

                            if (cliJuri != null)
                            {
                                aLQUILERRadGridView.Rows[count].Cells[2].Value = cliJuri.Ruc.ToString() + " - " + cliJuri.RazonSocial.ToString();
                            }
                            else if (cliNat != null)
                            {
                                aLQUILERRadGridView.Rows[count].Cells[2].Value = cliNat.Dni.ToString() + " - " + cliNat.NombreCompleto.ToString();
                            }
                        }
                    }
                }
                catch (Exception)
                {
                    MessageBox.Show("Error");
                }
                #endregion
            }
        }

        private void aLQUILERRadGridView_Click(object sender, EventArgs e)
        {
            #region Cliente
            try
            {
                var currentAlquiler = aLQUILERBindingSource.Current as ALQUILER;
                for (int count = 0; count < aLQUILERRadGridView.Rows.Count; count++)
                {
                    if (currentAlquiler != null)
                    {
                        CLIENTE a = aLQUILERRadGridView.Rows[count].Cells[1].Value as CLIENTE;
                        var cliJuri = (from c in cliJuridicoBL.GetAllFromClienteJuridico()
                                       where c.ClienteJuridicoId.Equals(a.Codigo)
                                       select c).SingleOrDefault();
                        var cliNat = (from c in cliNaturalBL.GetAllFromClienteNatural()
                                      where c.ClienteNaturalId.Equals(a.Codigo)
                                      select c).SingleOrDefault();

                        if(cliJuri != null)
                        {
                            aLQUILERRadGridView.Rows[count].Cells[2].Value = cliJuri.Ruc.ToString() + " - " + cliJuri.RazonSocial.ToString();
                        }
                        else if (cliNat != null)
                        {
                            aLQUILERRadGridView.Rows[count].Cells[2].Value = cliNat.Dni.ToString() + " - " + cliNat.NombreCompleto.ToString();
                        }
                    }
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Error");
            }
            #endregion
        }

        private void btnNuevo_Click(object sender, EventArgs e)
        {
            FrmMttoAlquiler frm = new FrmMttoAlquiler();
            frm.NuevoAlquiler();
            frm.ShowDialog();
            cargaData();
        }

        private void btnEditar_Click(object sender, EventArgs e)
        {
            var alquiler = aLQUILERBindingSource.Current as ALQUILER;
            var detAlquiler = detAlqBL.GetAllFromDetalleAlquilerByAlquilerId(alquiler.Codigo);

            alquiler.DETALLE_ALQUILER = detAlquiler;

            if (alquiler != null)
            {
                FrmMttoAlquiler frm = new FrmMttoAlquiler();
                frm._alquiler = alquiler;
                frm.EditarAlquiler();
                frm.ShowDialog();
                cargaData();
            }
            else
            {
                MessageBox.Show("Debe seleccionar un Alquiler.", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        public ALQUILER currentAlquiler { get; set; }

        private void aLQUILERRadGridView_DoubleClick(object sender, EventArgs e)
        {
            if (isExtend == true)
            {
                currentAlquiler = aLQUILERBindingSource.Current as ALQUILER;
                this.Close();
            }
        }

        private void cbxCancelado_CheckedChanged(object sender, EventArgs e)
        {
            if (cbxCancelado.Checked == true)
            {
                aLQUILERBindingSource.DataSource = alquilerBL.GetAllFromAlquilerCancelados();
            }
            else if (cbxCancelado.Checked == false)
            {
                cargaData();
            }
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            var alquiler = aLQUILERBindingSource.Current as ALQUILER;

            if (alquiler != null)
            {
                    FrmAlquilerMotivo frm = new FrmAlquilerMotivo();
                    frm.ShowDialog();
                    if (frm.currentAlquilerMotivo != null)
                    {
                        alquiler.Motivo = frm.currentAlquilerMotivo.Motivo.ToUpper();
                        alquiler.Cancelado = true;
                        alquilerBL.UpdateAlquiler(alquiler);

                        foreach (var item in alquiler.DETALLE_ALQUILER)
                        {
                            if (item.EQUIPO.Disponible == false)
                            {
                                item.EQUIPO.Disponible = true;
                                equipoBL.UpdateEquipo(item.EQUIPO);
                            }
                        }
                        MessageBox.Show("Alquiler Cancelado con exito", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        cargaData();
                    }
                }
            else
            {
                MessageBox.Show("Debe seleccionar un Alquiler.", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            }

        private void btnVerEntregas_Click(object sender, EventArgs e)
        {
            var currentAlquiler = aLQUILERBindingSource.Current as ALQUILER;

            if (currentAlquiler != null)
            {
                FrmEntrega frm = new FrmEntrega();
                frm._currentAlquiler = currentAlquiler;
                frm.currentUsuarioEntrega = currentUsuarioAlquiler;
                frm.verDetalleEntregaByAlquiler();
                frm.ShowDialog();
            }
            else
            {
                MessageBox.Show("Debe seleccionar un Alquiler.", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void btnVerDevolucion_Click(object sender, EventArgs e)
        {
            var currentAlquiler = aLQUILERBindingSource.Current as ALQUILER;

            if (currentAlquiler != null)
            {
                FrmDevolucion frm = new FrmDevolucion();
                frm._currentAlquiler = currentAlquiler;
                frm.currentUsuarioDevolucion = currentUsuarioAlquiler;
                frm.verDetalleDevolucionByAlquiler();
                frm.ShowDialog();
            }
            else
            {
                MessageBox.Show("Debe seleccionar un Alquiler.", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void btnCredito_Click(object sender, EventArgs e)
        {
            var currentAlquiler = aLQUILERBindingSource.Current as ALQUILER;

            if (currentAlquiler != null)
            {
                FrmCredito frm = new FrmCredito();
                frm._currentAlquiler = currentAlquiler;
                frm.currentUsuarioCredito = currentUsuarioAlquiler;
                frm.CargaDataByAlquiler();
                frm.ShowDialog();
            }
            else
            {
                MessageBox.Show("Debe seleccionar un Alquiler.", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        }
    }
